首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏灰子学技术

    Go语言之error

    写在前面的话:Go语言提供了一个error类型,专门用来表示程序出现异常的错误信息。 但是有时候,error本身提供的这些错误信息不能完全满足我们的要求,这种情况下我们就需要自己去改造error,来实现自己希望的error格式以及内容。 下面笔者主要来讲下这件事情,不过在讲这之前,我们先看下error的定义吧。 1. error介绍 ? 结果分析:因为没有go.txt这个文件,所以在尝试打开这个文件的时候,会返回错误信息“文件不存在”的非nil信息。 通过New()来自定义错误信息 在Go的errors包中实现了New()这个函数,所以我们能够直接使用New()函数来自定义我们希望的错误输出,例子如下所示: ?

    56910发布于 2020-04-02
  • 来自专栏后场技术

    Go进阶笔记关于Error

    很多人对于Goerror比较吐槽,说代码中总是会有大量的如下代码: if err ! = nil { ... } 其实很多时候是使用的姿势不对,或者说,对于error的用法没有完全理解,这里整理一下关于Go中的error 。 关于源码中的error 先看一下go源码中go/src/builtin/builtin.go对于error的定义: // The error built-in interface type is the ()的这段源码文件go/src/errors/errors.go,可以看到errorString实现了error解接口,而errors.New()其实返回的是一个 &errorString{text} 注意:关于Go中函数支持多参数返回,如果函数有error的通常把返回值的最后一个参数作为error 如果一个函数返回(value, error)这个时候必须先判定error Go中的panic 意味着程序挂了不能继续运行了

    66910发布于 2020-12-29
  • 来自专栏编程黑洞

    go中如何处理error

    前言 go 中的异常处理和其他语言大不相同,像 Java、C++、python 等语言都是通过抛出 Exception 来处理异常,而 go 是通过返回 error 来判定异常,并进行处理。 在 go 中有 panic 的机制,但 panic 意味着程序终止,代码不能继续运行了,不能期望调用者来解决它。而 error 是预期中的异常,希望调用者可以对其进行处理的。 # 1. error 是什么? 举个例子,使用 Open 来打开文件,但是可能该路径的文件不存在,出现异常,在 go 是通过判断 err 是否为 nil 来判定打开文件是否成功。 /main3.go:13 main.main D:/code/go_demo/main3.go:24 runtime.main D:/install/go18.3/src /runtime/proc.go:250 runtime.goexit D:/install/go18.3/src/runtime/asm_amd64.s:1571 如果不想保存堆栈信息

    1K10编辑于 2023-03-06
  • 来自专栏颇忒脱的技术博客

    Go Error 的处理最佳实践

    Goerror 和 Java 的 Exception 最明显的区别在于:原生库不携带 stacktrace原生库不支持 Wrap这给程序 debug 带来了一些麻烦,因此我们会使用 github.com 用作异常情况Error handling and Go 中提到:Go code uses error values to indicate an abnormal state所以尽量只把 error :<line>// testing.tRunner// /usr/local/opt/go/libexec/src/testing/testing.go:1259// runtime.goexit// /usr/local/opt/go/libexec/src/runtime/asm_amd64.s:1581可以看到使用 fmt format %+v 的时候才会打印出 stacktrace。 某些日志库,比如 go.uber.org/zap 会自动识别来自 github.com/pkg/errors 的 error,会打印 stacktrace(注意 errVerbose 字段):import

    89030编辑于 2022-11-21
  • 来自专栏Go编程点滴

    Go语言技巧 - 3.【Error工程化】Go Error的工程化探索

    was not found bookName is War and Peace main.searchBook /GoProject/godemo/main.go:98 main.borrowOne /GoProject/godemo/main.go:71 main.main /GoProject/godemo/main.go:60 runtime.main /usr/local/go1.13.5/src/runtime/proc.go:203 runtime.goexit /usr/local/go1.13.5/src/runtime/asm_amd64 的方法,处理一些特定情况下的逻辑; Tips: 不要一直用errors.Wrap来反复包装错误,堆栈信息会爆炸,具体情况可自行测试了解 利用go generate可以大量简化初始化Sentinel Error 同时也要注意日志采集工具是否支持多行匹配 小结 从现状来看,Go 语言的 Error Handling 已趋于共识,。

    91030发布于 2021-08-05
  • 来自专栏Devops专栏

    26.Go异常处理-error接口

    26.Go异常处理-error接口 异常介绍 所谓的异常:当GO检测到一个错误时,程序就无法继续执行了,反而出现了一些错误的提示,这就是所谓的**"异常"**。 1 error接口 error接口的定义 Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下: type error interface { Error () string } errors库提供的方法 import "errors" Go语言的标准库代码包errors为用户提供如下方法: image-20210605105719344 通过以上代码 ,可以发现error接口的使用是非常简单的(error是一个接口,该接口只声明了一个方法Error(),返回值是string类型,用以描述错误)。 常见的 error 使用方式 这种用法是非常常见的,例如,后面讲解到文件操作时,涉及到文件的打开,如下: func Open(name string) (*File, error) 在打开文件时,如果文件不存在

    38220编辑于 2022-01-17
  • 来自专栏仙士可博客

    go语言fatal error: all goroutines are asleep - deadlock!

    在默认情况下,go 通信是同步并且无缓冲的,而channel必须一边发送和接收端都准备才可以进行收发,否则就会进行死锁: 产生死锁的原因是: 通道ch写入1,这个时候是同步等待接收端接收的状态,而接收的代码却在下一行 而这个时候通道是没有发送端的,同样将造成死锁 解决方案 方案1 通过 起一个协程,可使得接收端和发送端并行执行: package main func main() {   ch := make(chan int)   go 这个时候,main主线程将会阻塞一秒,等待go匿名函数的发送端发送数据,不会形成死锁 方案2 给channel增加缓冲区 make的第二个参数可给channel增加缓冲区 package main

    2K20编辑于 2022-01-14
  • 来自专栏【腾讯云开发者】

    Go Error处理最佳实践

    Go语言也一样,在本篇文章中,我们来讨论一下Go语言的错误处理方式。 Go内建一个error接口类型作为go的错误标准处理 http://golang.org/pkg/builtin/#error // 接口定义type error interface { Error () string} http://golang.org/src/pkg/errors/errors.go // 实现func New(text string) error { 二、Go处理错误的三种方式 (一)经典Go逻辑 直观的返回error: type ZooTour interface { Enter() error VisitPanda func (g *Group) Go(f func(ctx context.Context) error) { g.wg.Add(1) if g.ch !

    1.7K10编辑于 2022-05-10
  • 来自专栏从流域到海域

    Go error接口源码和errors包源码

    Go语言中经常使用的error类型本质上是一个接口,该接口只有一个方法Error(),该方法用于约束实现该接口的类型必须具有合适的将错误信息以string类型返回的同名Error()方法。 它的源码非常简短,只有三行: type error interface { Error() string } 下面我们来看一个例子,errors包,这个包的源码也非常简单,只有4行: package } func (e *errorString) Error() string { return e.text } errors包内置的errorString是一个虽然简单但典型地实现了error接口的例子 ,因为它实现了Error()方法。 参考文献 Go语言圣经

    64520编辑于 2021-12-06
  • 来自专栏GopherCoder

    Go 内置库第一季:error

    近期我会持续更新内置库的学习笔记,主要参考的是文档 godoc 和 内置库的源码 本节的主题:error Go 中的错误处理和别的语言不一样,设计哲学也不一样,常有开发者埋怨 Go 语言中的错误处理 大纲 自己的常用的 error 错误处理方式 内置库实现的 error 总结 自己的总结常用的 error 错误处理方式 1. error 接口即可。 可以看下具体的 接口定义: type error interface { Error() string } errors.New 的具体实现 func New(text string) error 总结上文: 创建 error 存在两种方法 底层 是一个结构体实现了 error 接口 自定义的错误类型,实现 Error 方法即可 内置库实现的 error 错误很常见,是业务的一部分,那么内置的库在实现时也会遇到错误

    54030发布于 2018-12-10
  • 来自专栏网管叨bi叨

    Go应用中优雅处理Error的几个技巧

    Go语言很强大并且现在也十分流行 — 许多项目都是用Go语言来实现的,如Kubernetes。Go语言的一个有趣特性是它的多值返回功能提供了一种与其他编程语言不同的错误处理方法。 Goerror视为具有预定义类型的值,其本身是一个interface类型。然而,编写大型应用时需要有包含更多上下文信息的error才有价值,而不仅仅是一个值。 本文我们将探讨如何封装Goerror类型以在应用程序中带来更大的价值。 用户自定义类型 我们将重写的Go里自带的error类型,首先从一个自定义的错误类型开始,该错误类型将在程序中识别为error类型。因此,我们引入一个封装了Goerror的新自定义Error类型。 type GoError struct { error } 上下文数据 当我们在Go中说error是一个值时,它是字符串值 - 任何实现了Error() string函数的类型都可以视作error

    1.2K20发布于 2021-09-24
  • 来自专栏程序员奇点

    Go错误处理和Error日志打印实践

    Go错误处理和Error日志打印实践 如何参数校验? 原则: error应为上游提供简单易懂的提示 error应为问题排查提供帮助 error是业务处理的一部分,应尽可能处理error,防止未知错误以及panic 遵循依赖倒置原则 什么时候打印 error 发生了非预期的情况 如果打印error级别log,则认为一定发生了非预期的情况。例如mysql/下游挂了或自己代码中有bug,发生了从未考虑过的情况。 建议: 不需要处理的错误,错误级别不要使用Error级别,可以打印成Warn、Info、Debug等。 一般来说错误都需要向上传递,传递到最上层(一般是controller或者handler,转换成rsp code) 参考资料 https://ethancai.github.io/2017/12/29/Error-Handling-in-Go

    1K10编辑于 2024-03-11
  • 来自专栏Go编程点滴

    Go语言技巧 - 2.【错误处理】谈谈Go Error的前世今生

    Go 2 Error Proposal谈起 Goerror的处理一直都是很大的争议点,这点官方也已多次发文,并在2019年1月推出了一篇Proposal,有兴趣的可以点击链接细细品读。 programs while displaying them for diagnosis Wrap - 隐藏实现,针对代码调用时的堆栈信息 Is/As - 展示细节,针对底层真正实现的数据结构 当前实现 Go target) { return true } err = Unwrap(err) } return false } 关键点 反复Unwrap、提取错误,提取底层的实现类型 小结 Go 语言对error的定义很简单,虽然带来了灵活性,但也导致处理方式泛滥,一如当年的Go语言的版本管理。 如今的go mod版本管理机制已经”一统江湖“,随着大家对error这块的不断深入,Error Handling也总会达成共识。

    61220发布于 2021-08-05
  • 来自专栏全栈程序员必看

    解决Error response from daemon: oci runtime error: container_linux.go:247: starting container process「

    安装启动都成功了) 我是在guigu上学习的springboot的视频,有一些很难受的问题,这个问题已经让我难受一天多了,后来终于在一片文章中解决了,给大家分享一下: docker 启动容器报错:Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused “

    2.1K10编辑于 2022-09-14
  • 来自专栏Go技术干货

    Go 项目分层下的最佳 error 处理方式

    前言在 Go 语言中,对于程序中可能出现的问题,比如数据库连接失败,文件读取错误等,都是使用基于内置的 error 接口类型的值来表示和处理错误。 而在分层的项目中,如何最佳处理 error成为众多人关注的问题,本文将探讨 Go 项目分层下的最佳 error 处理方式。准备好了吗?准备一杯你最喜欢的饮料或茶,随着本文一探究竟吧。 分层下的最佳 error 处理方式遵循以下建议,我们可以更好地处理 error :1、一个 error,应该只被处理一次2、让 error 包含更多的信息3、原始 error,应保证完整性,不被破坏4、 :该函数用于提取 err 中的原始 error,它会递归地检查 error,直到找到最底层的原始 error,如果存在的话了解了以上函数的功能,我们来看看项目分层下最佳 error 的具体实现。 小结本文对 Go 项目分层下的最佳 error 处理方式进行介绍,并通过使用 github.com/pkg/errors 库中的一些实用函数来提供实现示例。

    1K52编辑于 2023-11-06
  • 来自专栏Go工具箱

    Go错误集锦 | 处理error时有哪些常见的陷阱

    今天跟大家聊聊在Go中处理error时有哪些常见的陷阱以及如何避免。 陷阱01:不理解使用panic处理错误的场景 在Go中,error通常是被当做函数或方法的最后一个返回值来处理的。 陷阱02:忽略了fmt.Errorf中%w指令的使用 在Go中,我们可以使用fmt.Errorf函数根据占位符将一个值格式化成一个新的错误值,例如我们可以通过%v指令将一个error值转换成一个新的error 如图所示: 自go1.13版本起,go支持了%w指令。该指令是将一个error嵌套到另一个error中。 所以,自go1.13起,我们可通过errors.Is函数来进行值的比较。该函数会对错误链进行层层比较。 陷阱05:对error进行了多次处理 将error处理了多次也是Go研发者经常犯的一个错误。 但只有在产生非预期及依赖服务产生错误的场景下使用 自go1.13版本起,增加了%w指令,该指令可以将一个error嵌套到另一个error中,可以将源错误返回给调用者,以便调用者可以根据错误类型来做不同的逻辑处理

    71810编辑于 2023-01-31
  • 来自专栏飞雪无情的博客

    Go语言(golang)的错误(error)处理的推荐方案

    对于Go语言(golang)的错误设计,相信很多人已经体验过了,它是通过返回值的方式,来强迫调用者对错误进行处理,要么你忽略,要么你处理(处理也可以是继续返回给调用者),对于golang这种设计方式,我们会在代码中写大量的 { Error() string } 它只有一个方法 Error,只要实现了这个方法,就是实现了error。 ,我们就可以通过New函数,辅助我们创建不同的错误了,这其实就是我们经常用到的errors.New函数,被我们一步步剖析演化而来,现在大家对Go语言(golang)内置的错误error有了一个清晰的认知了 存在的问题 虽然Go语言对错误的设计非常简洁,但是对于我们开发者来说,很明显是不足的,比如我们需要知道出错的更多信息,在什么文件的,哪一行代码?只有这样我们才更容易的定位问题。 因为Go语言提供的错误太简单了,以至于简单的我们无法更好的处理问题,甚至不能为我们处理错误,提供更有用的信息,所以诞生了很多对错误处理的库,github.com/pkg/errors是比较简洁的一样,并且功能非常强大

    2K10发布于 2020-02-10
  • 来自专栏数据小冰

    Go语言中常见100问题-#49 wrap error

    ‍‍‍‍‍‍通常来说,有以下两种场景需要对error进行包装. 向error中添加上下文信息 将error转为一个特定的error 作者对上面的场景各举了一个例子进行说明。 这种情况下,可以通过wrap error操作将原error包装到Forbidden中。 上面的两个例子中,原始error是能够继续访问到的。 在Go1.13之前,wrap error需要先定义一个结构体,实现Error() string方法。这种通过自定义类型的优点是非常灵活,可以根据需要添加任何额外的信息。 = nil { return BarError{Err: err} } ‍‍ 第三种方法是使用直接%w, 这个是在Go1.13引入的,性质同第二种方法,优点是不用定义一个结构体实现Error 与第三种方法的区别在于,使用%v返回的error不是对原error的wrap操作,而是将其转成了另一个error, 原error无法在访问了, 即调用方不能unwrap当前的error将它与原始的bar

    52030编辑于 2022-08-15
  • 来自专栏学院君的专栏

    Go 语言错误及异常处理篇(一):error 接口

    Go 语言错误处理机制 相比 PHP 而言,Go 语言错误及异常处理机制要简单明了的多,不需要学习了解那么多复杂的概念、函数和类型,Go 语言为错误处理定义了一个标准模式,即 error 接口,该接口的定义非常简单 : type error interface { Error() string } 其中只包含了一个 Error() 方法,用于返回错误消息。 fmt.Println(err) } else { fmt.Printf("add(%d, %d) = %d\n", x, y, z) } 注意到我们在打印错误信息时,直接传入了 err 对象实例,因为 Go 以上这种错误处理已经能够满足我们日常编写 Go 代码时大部分错误处理的需求了,事实上,Go 底层很多包进行错误处理时就是这样做的,此外我们还可以通过 fmt.Errorf() 格式化方法返回 error (Sprintf(format, a...)) } 内置错误类型 除了上面这种最基本的使用 errors.New 方法返回错误信息之外,Go 语言内置的很多包还封装了很多更复杂的错误类型,以 os 包为例

    2K30发布于 2019-08-08
  • 来自专栏AlwaysBeta

    Go Error 嵌套到底是怎么实现的?

    原文链接: Go Error 嵌套到底是怎么实现的? Go Error 的设计哲学是 「Errors Are Values」。 这句话应该怎么理解呢?翻译起来挺难的。 Go Error 源码很简单,寥寥几行: // src/builtin/builtin.go type error interface { Error() string } error 是一个接口类型 如果想根据返回的 error 类型做不同处理,就无法实现了。 因此,Go 1.13 为我们提供了 wrapError 来处理这个问题。 // src/errors/wrap.go func Unwrap(err error) error { u, ok := err. /2019/09/06/go1.13-error-wrapping.html

    48220编辑于 2022-01-14
领券